Events এবং Event Emitters (ইভেন্টস এবং ইভেন্ট ইমিটারস)

Computer Programming - নোড জেএস (Node.js)
182

Node.js এ ইভেন্ট-ড্রিভেন প্রোগ্রামিং একটি গুরুত্বপূর্ণ ধারণা। ইভেন্ট ড্রিভেন আর্কিটেকচারে, একটি প্রোগ্রাম বিভিন্ন ইভেন্টের জন্য অপেক্ষা করে এবং এই ইভেন্টগুলির জন্য ইমিটার (event emitter) ব্যবহার করে কোড পরিচালিত হয়। Node.js-এ events মডিউল এই ইভেন্ট-ড্রিভেন প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়, যা ইভেন্ট ইমিটার তৈরি করতে সাহায্য করে এবং ইভেন্টের সাথে যুক্ত callback ফাংশন চালায়।

এখানে, আমরা Node.js এ ইভেন্ট এবং ইভেন্ট ইমিটার ব্যবহারের বিভিন্ন দিক নিয়ে আলোচনা করব।


১. ইভেন্ট (Events)

ইভেন্ট হলো একটি অ্যাসিঙ্ক্রোনাস একশন বা ঘটনার প্রতিনিধিত্ব। উদাহরণস্বরূপ, একটি ক্লিক ইভেন্ট বা কোনো রিকোয়েস্টের রেসপন্স প্রাপ্তি একটি ইভেন্ট হতে পারে। ইভেন্টগুলি সাধারণত ইভেন্ট ইমিটার এর মাধ্যমে তৈরি এবং ট্রিগার করা হয়।

ইভেন্ট ট্রিগার করার জন্য Node.js এ EventEmitter ক্লাস ব্যবহার করা হয়, যা events মডিউলে পাওয়া যায়।


২. EventEmitter ক্লাস

Node.js এর EventEmitter ক্লাসটি ইভেন্ট ট্রিগার করতে এবং ইভেন্টের জন্য লিসেনার (listener) যুক্ত করতে ব্যবহৃত হয়। একটি ইভেন্ট ইমিটার একটি নির্দিষ্ট ইভেন্ট ঘটানোর জন্য emit() মেথড ব্যবহার করে, এবং তার জন্য একটি কলব্যাক ফাংশন (listener) on() মেথডের মাধ্যমে সংযুক্ত করা হয়।

EventEmitter ক্লাস ব্যবহার:

  1. ইভেন্ট ইমিটার তৈরি করা:
    • প্রথমে, EventEmitter ক্লাসকে events মডিউল থেকে ইম্পোর্ট করতে হয়।
    • তারপর, একটি ইভেন্ট ইমিটার তৈরি করা হয় এবং ইভেন্টের জন্য লিসেনার যুক্ত করা হয়।

উদাহরণ:

const EventEmitter = require('events');  // events মডিউল ইম্পোর্ট
const myEmitter = new EventEmitter();    // নতুন ইভেন্ট ইমিটার তৈরি

// ইভেন্ট লিসেনার যোগ করা
myEmitter.on('event', () => {
  console.log('An event has occurred!');
});

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event');  // এটি কনসোলে "An event has occurred!" প্রিন্ট করবে

এখানে, myEmitter.on() মেথডের মাধ্যমে "event" নামক ইভেন্টের জন্য একটি কলব্যাক ফাংশন যুক্ত করা হয়েছে। এরপর myEmitter.emit() মেথডের মাধ্যমে ইভেন্টটি ট্রিগার করা হয়েছে এবং কলব্যাক ফাংশনটি চালানো হয়েছে।


৩. অনেকগুলো লিসেনার (Multiple Listeners)

একই ইভেন্টের জন্য একাধিক লিসেনারও যুক্ত করা সম্ভব। এতে, একটি ইভেন্ট ঘটানোর পর একাধিক ফাংশন একসাথে কার্যকর হবে।

উদাহরণ:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// একাধিক লিসেনার যোগ করা
myEmitter.on('event', () => {
  console.log('Listener 1 executed');
});

myEmitter.on('event', () => {
  console.log('Listener 2 executed');
});

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event');  // দুটি লিসেনার একসাথে কার্যকর হবে

এখানে, "event" ইভেন্টটি ট্রিগার করার পর দুটি লিসেনারই কার্যকর হবে এবং কনসোলে দুটি বার্তা প্রিন্ট হবে।


৪. Once মেথড (One-time Listener)

কখনো কখনো আপনি চান যে, একটি ইভেন্ট ঘটলে একবারই একটি ফাংশন কার্যকর হোক। এমন ক্ষেত্রে once() মেথড ব্যবহার করা হয়। এটি ইভেন্ট ঘটলে একবারই কলব্যাক ফাংশন কার্যকর করবে এবং এরপর আর কাজ করবে না।

উদাহরণ:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// once() ব্যবহার করে একবারে ইভেন্ট শোনা
myEmitter.once('event', () => {
  console.log('This event will only trigger once');
});

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event');
myEmitter.emit('event');  // দ্বিতীয়বার কিছু হবে না

এখানে, "event" ইভেন্টটি প্রথমবার ট্রিগার হলে কলব্যাক ফাংশন কার্যকর হবে, কিন্তু দ্বিতীয়বার ট্রিগার করা হলে কিছু হবে না।


৫. অর্গুমেন্ট সহ ইভেন্ট ট্রান্সমিট করা (Passing Arguments to Events)

আপনি যদি ইভেন্ট ট্রিগার করার সময় অতিরিক্ত অর্গুমেন্ট পাস করতে চান, তবে emit() মেথডে সেই অর্গুমেন্টগুলো দিতে পারেন।

উদাহরণ:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// লিসেনারে অর্গুমেন্ট গ্রহণ
myEmitter.on('event', (message, code) => {
  console.log(`Received message: ${message}, code: ${code}`);
});

// ইভেন্ট ট্রিগার এবং অর্গুমেন্ট পাস করা
myEmitter.emit('event', 'Hello, Node.js!', 200);

এখানে, "event" ইভেন্টটি ট্রিগার করার সময় দুটি অর্গুমেন্ট পাস করা হয়েছে ('Hello, Node.js!' এবং 200), যা কলব্যাক ফাংশনে গ্রহণ করা হয়েছে।


৬. ইভেন্টের জন্য কলব্যাক ফাংশন আনরেজিস্টার করা (Removing Event Listeners)

আপনি যখন চান যে, কোনো নির্দিষ্ট ইভেন্টের জন্য কলব্যাক ফাংশন আর কার্যকর না হোক, তখন removeListener() বা off() মেথড ব্যবহার করা হয়।

উদাহরণ:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// একটি লিসেনার যোগ করা
const listener = () => {
  console.log('This will be removed');
};
myEmitter.on('event', listener);

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event');  // প্রথমবার কার্যকর হবে

// লিসেনার মুছে ফেলা
myEmitter.removeListener('event', listener);

// ইভেন্ট ট্রিগার করা, দ্বিতীয়বার কিছু হবে না
myEmitter.emit('event');

এখানে, removeListener() মেথড ব্যবহার করে "event" ইভেন্টের জন্য একটি নির্দিষ্ট লিসেনার মুছে ফেলা হয়েছে, যার কারণে দ্বিতীয়বার "event" ট্রিগার করলে কিছু হবে না।


সারাংশ

Node.js এর ইভেন্টস এবং EventEmitter মডিউল ব্যবহার করে আপনি ইভেন্ট ড্রিভেন আর্কিটেকচার বাস্তবায়ন করতে পারেন, যেখানে একাধিক ইভেন্টের জন্য লিসেনার যুক্ত করে কোডের কার্যক্রম পরিচালনা করা হয়। EventEmitter ক্লাসের মাধ্যমে ইভেন্ট ট্রিগার করা হয় এবং সেই ইভেন্টের জন্য কলব্যাক ফাংশন বা লিসেনার যুক্ত করা হয়। আপনি ইভেন্টে আর্গুমেন্ট পাঠাতে, একাধিক লিসেনার ব্যবহার করতে এবং একবারের জন্য লিসেনার সক্রিয় করতে পারেন, যা ইভেন্ট-ড্রিভেন প্রোগ্রামিংয়ের একটি শক্তিশালী বৈশিষ্ট্য।

Content added By

Events এর ধারণা এবং Event Emitter Class

219

Node.js এর ইভেন্ট-ড্রিভেন আর্কিটেকচার একটি গুরুত্বপূর্ণ ধারণা, যা কোডের কার্যকারিতা এবং স্কেলেবিলিটি উন্নত করতে সাহায্য করে। Node.js এ ইভেন্টস এমন একটি কনসেপ্ট যা অ্যাসিনক্রোনাস অপারেশন, যেমন HTTP সার্ভারের রিকোয়েস্ট বা টাইমারের ইভেন্ট হ্যান্ডলিং করতে ব্যবহৃত হয়। ইভেন্ট হ্যান্ডলিংয়ের জন্য Node.js এ EventEmitter ক্লাস ব্যবহৃত হয়।


১. Events এর ধারণা

ইভেন্ট একটি নির্দিষ্ট ঘটনা যা অ্যাপ্লিকেশনে ঘটে, এবং যেটি কোনো কার্যকলাপ বা ক্রিয়া ট্রিগার করতে পারে। Node.js এ ইভেন্ট ড্রিভেন আর্কিটেকচার ব্যবহৃত হয়, যেখানে বিভিন্ন কার্যকলাপ ইভেন্টের মাধ্যমে সম্পন্ন হয়। উদাহরণস্বরূপ, যখন একটি HTTP সার্ভার চালু হয়, এটি একটি 'request' ইভেন্ট তৈরি করে, এবং আপনি এই ইভেন্টটিকে ট্র্যাক করে কাস্টম কার্যকলাপ চালাতে পারেন।

ইভেন্ট সাধারণত কিছু অ্যাকশন বা ঘটনা থেকে ট্রিগার হয়, এবং এই ঘটনা বা অ্যাকশন সম্পন্ন হলে একটি ইভেন্ট হ্যান্ডলার (callback function) চালানো হয়।


২. EventEmitter Class

EventEmitter ক্লাস Node.js এর events মডিউলের অন্তর্গত। এটি Node.js এর ইভেন্ট সিস্টেমের মূল ভিত্তি এবং বিভিন্ন ইভেন্টের সাথে সংযুক্ত কার্যকলাপ হ্যান্ডল করতে ব্যবহৃত হয়।

a. EventEmitter Class এর মূল ধারণা

EventEmitter ক্লাস ইভেন্ট তৈরি এবং তার সাথে সম্পর্কিত হ্যান্ডলার (callback function) যোগ করার অনুমতি দেয়। আপনি যখন কোনো ইভেন্ট ট্রিগার করেন, তখন সেই ইভেন্টের সাথে সংযুক্ত কলব্যাক ফাংশনগুলো চালানো হয়।

b. EventEmitter Methods

EventEmitter ক্লাসে কিছু গুরুত্বপূর্ণ মেথড রয়েছে:

  1. on(event, listener):

    • একটি ইভেন্টের জন্য একটি নতুন লিসনার (হ্যান্ডলার) যোগ করে।
    const EventEmitter = require('events');
    const emitter = new EventEmitter();
    
    emitter.on('greet', () => {
      console.log('Hello, world!');
    });
    
    emitter.emit('greet');  // 'Hello, world!' দেখাবে
  2. emit(event, [arg1], [arg2], [...]):

    • একটি ইভেন্ট ট্রিগার করে এবং এর সাথে সংযুক্ত লিসনার ফাংশনগুলিকে কল করে।
    emitter.emit('greet');  // 'Hello, world!' কল হবে
  3. once(event, listener):

    • একটি ইভেন্টের জন্য শুধুমাত্র একবার লিসনার যোগ করে।
    emitter.once('greetOnce', () => {
      console.log('This will only run once!');
    });
    
    emitter.emit('greetOnce');  // 'This will only run once!' কল হবে
    emitter.emit('greetOnce');  // কিছুই হবে না, কারণ এটি একবারই চালানো যাবে
  4. removeListener(event, listener):

    • নির্দিষ্ট ইভেন্টের জন্য একটি লিসনার সরিয়ে দেয়।
    const greetHandler = () => console.log('Greeting...');
    emitter.on('greet', greetHandler);
    emitter.removeListener('greet', greetHandler);
    emitter.emit('greet');  // কিছু হবে না, কারণ লিসনার সরিয়ে ফেলা হয়েছে
  5. removeAllListeners([event]):

    • একটি নির্দিষ্ট ইভেন্ট বা সমস্ত ইভেন্টের জন্য সমস্ত লিসনার সরিয়ে দেয়।
    emitter.removeAllListeners('greet');
    emitter.emit('greet');  // কিছু হবে না, কারণ সব লিসনার সরিয়ে ফেলা হয়েছে

৩. ইভেন্ট তৈরি এবং ব্যবহার

Node.js এ ইভেন্ট তৈরি করার জন্য EventEmitter ক্লাসের একটি উদাহরণ দেখানো হলো:

উদাহরণ: ইভেন্ট সিস্টেম ব্যবহার করা

const EventEmitter = require('events');

// একটি কাস্টম ক্লাস তৈরি করা যা EventEmitter থেকে ইন্সট্যান্স নেয়
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// একটি 'message' নামের ইভেন্টের জন্য লিসনার যোগ করা
myEmitter.on('message', (text) => {
  console.log('Received message:', text);
});

// 'message' ইভেন্ট ট্রিগার করা
myEmitter.emit('message', 'Hello, Node.js!');

এখানে, message নামে একটি ইভেন্ট তৈরি করা হয়েছে এবং তার সাথে একটি কলব্যাক ফাংশন যুক্ত করা হয়েছে। যখন emit() মেথডের মাধ্যমে message ইভেন্টটি ট্রিগার করা হবে, তখন কলব্যাক ফাংশনটি চলবে এবং কনসোলে 'Received message: Hello, Node.js!' দেখাবে।


৪. ইভেন্ট-ড্রিভেন প্যাটার্ন

Node.js এর ইভেন্ট-ড্রিভেন আর্কিটেকচার বিভিন্ন অ্যাসিনক্রোনাস অপারেশনের জন্য উপযুক্ত, যেমন HTTP রিকোয়েস্ট, ফাইল অপারেশন, স্ট্রিমিং ইত্যাদি। ইভেন্ট-ড্রিভেন প্যাটার্নের মাধ্যমে Node.js দ্রুত এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করতে পারে।

উদাহরণস্বরূপ, একটি HTTP সার্ভারে ইভেন্ট ব্যবহার করা:

const http = require('http');

// সার্ভার তৈরি করা
const server = http.createServer((req, res) => {
  res.write('Hello, world!');
  res.end();
});

// সার্ভার ইভেন্ট ট্রিগার করা
server.on('listening', () => {
  console.log('Server is listening on port 3000');
});

// 3000 পোর্টে সার্ভার শুরু করা
server.listen(3000);

এখানে, listening নামে একটি ইভেন্ট ট্রিগার করা হচ্ছে, যা সার্ভার শুরু হওয়ার পর কলব্যাক ফাংশন চালাবে এবং 'Server is listening on port 3000' মেসেজটি কনসোলে দেখাবে।


সারাংশ

Node.js এর ইভেন্ট-ড্রিভেন আর্কিটেকচার এবং EventEmitter ক্লাস খুবই গুরুত্বপূর্ণ এবং শক্তিশালী। এটি ইভেন্টগুলির মাধ্যমে অ্যাসিনক্রোনাস কার্যকলাপ পরিচালনা করতে সাহায্য করে এবং আপনাকে কোডের কার্যকারিতা নিয়ন্ত্রণ করতে সক্ষম করে। EventEmitter ক্লাস ব্যবহার করে আপনি ইভেন্ট তৈরি করতে পারেন, সেগুলির সাথে কলব্যাক ফাংশন যুক্ত করতে পারেন, এবং ইভেন্টগুলো ট্রিগার করে কার্যকলাপ সম্পন্ন করতে পারেন।

Content added By

Custom Events তৈরি এবং Emit করা

225

Node.js এর events মডিউলটি ব্যবহার করে আপনি Custom Events তৈরি এবং emit করতে পারেন। এটি ইভেন্ট-ড্রিভেন আর্কিটেকচার ব্যবহার করে যেখানে আপনার অ্যাপ্লিকেশনের মধ্যে কাস্টম ইভেন্ট তৈরি করা এবং সেই ইভেন্টগুলির জন্য লিসেনার (listener) সেট করা সম্ভব। EventEmitter ক্লাস ব্যবহার করে আপনি কাস্টম ইভেন্ট তৈরি এবং ট্রিগার করতে পারেন।


১. EventEmitter ক্লাস

Node.js এর EventEmitter ক্লাসটি ইভেন্ট তৈরি এবং হ্যান্ডল করার জন্য ব্যবহৃত হয়। এই ক্লাসের মাধ্যমে আপনি ইভেন্ট তৈরি করতে পারেন এবং যখন সেই ইভেন্টটি ট্রিগার হবে, তখন সংশ্লিষ্ট কোড এক্সিকিউট হয়।

কিছু সাধারণ মেথড:

  • on(event, listener): একটি কাস্টম ইভেন্টের জন্য লিসেনার যোগ করা।
  • emit(event, [...args]): একটি কাস্টম ইভেন্ট ট্রিগার করা।
  • once(event, listener): একটি ইভেন্টের জন্য একটি লিসেনার সেট করা, যা ইভেন্ট একবার ট্রিগার হলে পরে আর চলবে না।
  • removeListener(event, listener): নির্দিষ্ট ইভেন্টের লিসেনার রিমুভ করা।

২. Custom Event তৈরি এবং Emit করা

এখানে একটি উদাহরণ দেওয়া হল যেখানে একটি কাস্টম ইভেন্ট তৈরি করা হবে এবং সেই ইভেন্টটি emit করা হবে:

উদাহরণ:

const EventEmitter = require('events');

// CustomEmitter ক্লাস তৈরি করা যা EventEmitter থেকে ইনহেরিট করবে
class CustomEmitter extends EventEmitter {}

// একটি ইভেন্ট ইমিটার তৈরি করা
const myEmitter = new CustomEmitter();

// একটি কাস্টম ইভেন্ট 'greet' তৈরি করা
myEmitter.on('greet', (name) => {
  console.log(`Hello, ${name}! Welcome to Node.js.`);
});

// কাস্টম ইভেন্ট 'greet' emit করা
myEmitter.emit('greet', 'Alice');  // Output: Hello, Alice! Welcome to Node.js.
myEmitter.emit('greet', 'Bob');    // Output: Hello, Bob! Welcome to Node.js.

এখানে, আমরা CustomEmitter নামক একটি ক্লাস তৈরি করেছি যা EventEmitter ক্লাসকে ইনহেরিট করে। তারপর, greet নামক একটি কাস্টম ইভেন্ট তৈরি করে, এবং সেই ইভেন্টের জন্য একটি listener (on) যোগ করেছি যা একটি নাম প্রিন্ট করবে। তারপর আমরা emit মেথড ব্যবহার করে ইভেন্টটি ট্রিগার (প্রেরণ) করেছি।


৩. once মেথড ব্যবহার

once মেথড দিয়ে আপনি এমন একটি ইভেন্টের জন্য লিসেনার সেট করতে পারেন যা শুধুমাত্র একবারই কাজ করবে। যখন ইভেন্টটি একবার ট্রিগার হবে, তখন সেই লিসেনারটি আর চালানো হবে না।

উদাহরণ:

const EventEmitter = require('events');

// CustomEmitter ক্লাস তৈরি করা
class CustomEmitter extends EventEmitter {}

const myEmitter = new CustomEmitter();

// একটি কাস্টম ইভেন্ট 'hello' তৈরি করা যা একবারই ট্রিগার হবে
myEmitter.once('hello', () => {
  console.log('Hello event triggered!');
});

// কাস্টম ইভেন্ট 'hello' emit করা
myEmitter.emit('hello');  // Output: Hello event triggered!
myEmitter.emit('hello');  // কোন আউটপুট হবে না

এখানে, once মেথড ব্যবহার করে, hello ইভেন্টটি শুধু একবারই ট্রিগার হবে, এবং পরবর্তীতে আর এই ইভেন্টটি কোনো আউটপুট তৈরি করবে না।


৪. কাস্টম ইভেন্টে আর্গুমেন্ট পাঠানো

আপনি যখন emit মেথড ব্যবহার করেন, তখন আপনি আর্গুমেন্টও পাঠাতে পারেন। এই আর্গুমেন্টগুলো লিসেনার ফাংশনে পাস করা হবে।

উদাহরণ:

const EventEmitter = require('events');

// CustomEmitter ক্লাস তৈরি করা
class CustomEmitter extends EventEmitter {}

const myEmitter = new CustomEmitter();

// 'dataReceived' ইভেন্টে আর্গুমেন্ট পাঠানো
myEmitter.on('dataReceived', (data) => {
  console.log(`Data received: ${data}`);
});

// কাস্টম ইভেন্ট 'dataReceived' emit করা
myEmitter.emit('dataReceived', 'Hello, this is custom data!'); 
// Output: Data received: Hello, this is custom data!

এখানে, dataReceived নামক কাস্টম ইভেন্টে একটি আর্গুমেন্ট (ডেটা) পাঠানো হয়েছে, এবং সেই আর্গুমেন্টটি ইভেন্ট হ্যান্ডলারের মাধ্যমে গ্রহণ করা হয়েছে।


৫. Listener Remove করা

যদি আপনি কোন ইভেন্টের জন্য একটি listener রিমুভ করতে চান, তবে removeListener বা off মেথড ব্যবহার করতে পারেন।

উদাহরণ:

const EventEmitter = require('events');

// CustomEmitter ক্লাস তৈরি করা
class CustomEmitter extends EventEmitter {}

const myEmitter = new CustomEmitter();

const greetListener = (name) => {
  console.log(`Hello, ${name}!`);
};

// ইভেন্টে লিসেনার যোগ করা
myEmitter.on('greet', greetListener);

// কাস্টম ইভেন্ট 'greet' emit করা
myEmitter.emit('greet', 'Alice');  // Output: Hello, Alice!

// লিসেনার রিমুভ করা
myEmitter.removeListener('greet', greetListener);

// কাস্টম ইভেন্ট 'greet' emit করা (এইবার কোন আউটপুট হবে না)
myEmitter.emit('greet', 'Bob');

এখানে, প্রথমে greetListener নামক একটি লিসেনার যোগ করা হয়েছে এবং ইভেন্ট greet ট্রিগার হলে এটি কাজ করবে। পরে, removeListener মেথড ব্যবহার করে সেই লিসেনারটি রিমুভ করা হয়েছে, এবং এরপর ইভেন্ট ট্রিগার হলে আর কোন আউটপুট হবে না।


সারাংশ

  • Custom Events Node.js এ কাস্টম ইভেন্ট তৈরি এবং ট্রিগার করার জন্য EventEmitter ক্লাস ব্যবহার করা হয়।
  • on মেথড দিয়ে কাস্টম ইভেন্টের জন্য লিসেনার যোগ করা হয়, এবং emit মেথড দিয়ে ইভেন্টটি ট্রিগার করা হয়।
  • once মেথড একটি ইভেন্টের জন্য লিসেনার যোগ করে যা একবারই কার্যকরী হয়।
  • removeListener বা off মেথড দিয়ে একটি নির্দিষ্ট ইভেন্টের লিসেনার রিমুভ করা যায়।

এই কাস্টম ইভেন্ট এবং ইভেন্ট-ড্রিভেন মডেল Node.js অ্যাপ্লিকেশনকে আরও মডুলার এবং স্কেলেবেল করে তোলে।

Content added By

Event Listener যুক্ত করা এবং পরিচালনা

191

Event Listener হল একটি ফাংশন যা ইভেন্টটি ট্রিগার হওয়া পর্যন্ত অপেক্ষা করে এবং তারপর সেই ইভেন্টের প্রতিক্রিয়া হিসেবে নির্দিষ্ট কাজটি সম্পাদন করে। JavaScript এবং Node.js এ ইভেন্ট লিসেনার ব্যবহৃত হয়, যেখানে কোন ইভেন্ট (যেমন ক্লিক, মাউস মুভ, কী প্রেস, ডাটা রিসিভ করা ইত্যাদি) ঘটলে নির্দিষ্ট ফাংশনটি কার্যকর হয়।

Node.js এ, EventEmitter ক্লাস ইভেন্ট এবং ইভেন্ট লিসেনার পরিচালনা করতে ব্যবহৃত হয়, যা মূলত Node.js এ সকল ইভেন্ট লজিকের ভিত্তি। আপনি EventEmitter ক্লাস ব্যবহার করে নিজস্ব ইভেন্ট তৈরি করতে পারেন এবং সেই ইভেন্টের জন্য লিসেনার বা হ্যান্ডলার সংযুক্ত করতে পারেন।


১. JavaScript এবং Node.js এ Event Listener যুক্ত করা

JavaScript (Client-Side) এ Event Listener

ব্রাউজারে JavaScript দিয়ে ইভেন্ট লিসেনার যুক্ত করার জন্য, আপনি addEventListener() মেথড ব্যবহার করেন। এটি একাধিক ইভেন্ট টাইপ যেমন click, mouseover, keydown ইত্যাদির জন্য কার্যকর।

উদাহরণ ১: click ইভেন্ট লিসেনার
// বাটনে ক্লিক ইভেন্ট লিসেনার
const button = document.getElementById('myButton');

button.addEventListener('click', function() {
  console.log('Button clicked!');
});

এখানে, addEventListener() মেথডটি myButton আইডির বাটনে click ইভেন্টের জন্য একটি লিসেনার যুক্ত করেছে। যখন বাটনে ক্লিক করা হবে, তখন কনসোলে 'Button clicked!' মেসেজটি প্রিন্ট হবে।

উদাহরণ ২: keydown ইভেন্ট লিসেনার
// কিবোর্ডে কী চাপা হলে ইভেন্ট লিসেনার
document.addEventListener('keydown', function(event) {
  console.log(`Key pressed: ${event.key}`);
});

এখানে, keydown ইভেন্টের জন্য একটি লিসেনার যুক্ত করা হয়েছে, যা কীবোর্ডের কী প্রেস ইভেন্টটি ধরবে এবং কীটি কনসোলে প্রিন্ট করবে।


২. Node.js এ Event Listener যুক্ত করা (EventEmitter)

Node.js এ ইভেন্ট ব্যবস্থাপনা EventEmitter ক্লাসের মাধ্যমে করা হয়। EventEmitter ব্যবহার করে আপনি নিজস্ব ইভেন্ট তৈরি করতে পারেন এবং সেই ইভেন্টের জন্য লিসেনার যোগ করতে পারেন।

১. EventEmitter ব্যবহার করা

EventEmitter হল একটি ক্লাস যা Node.js এর events মডিউল থেকে পাওয়া যায়। এই ক্লাস ব্যবহার করে আপনি ইভেন্ট তৈরি করতে এবং ইভেন্টের জন্য এক বা একাধিক লিসেনার যুক্ত করতে পারেন।

উদাহরণ ১: EventEmitter ইভেন্ট তৈরি এবং লিসেনার যোগ করা
const EventEmitter = require('events');  // EventEmitter ক্লাস ইমপোর্ট করা

class MyEmitter extends EventEmitter {}  // MyEmitter নামক নতুন ক্লাস তৈরি করা

const myEmitter = new MyEmitter();  // MyEmitter এর একটি ইনস্ট্যান্স তৈরি

// 'event1' নামক ইভেন্টের জন্য লিসেনার যুক্ত করা
myEmitter.on('event1', () => {
  console.log('event1 was triggered!');
});

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event1');  // কনসোলে 'event1 was triggered!' প্রিন্ট হবে

এখানে, MyEmitter ক্লাস EventEmitter ক্লাস থেকে ইনহেরিট করা হয়েছে। এরপর, 'event1' নামক একটি ইভেন্ট তৈরি করা হয়েছে এবং তার জন্য একটি লিসেনার যোগ করা হয়েছে। যখন emit() মেথড ব্যবহার করে 'event1' ট্রিগার করা হয়েছে, তখন লিসেনারটি কার্যকর হয় এবং কনসোলে মেসেজটি প্রিন্ট হয়।

২. একাধিক লিসেনার যুক্ত করা

একাধিক লিসেনার যুক্ত করা সম্ভব এবং যখনই ইভেন্টটি ট্রিগার হয়, তখন সকল লিসেনার একে একে কার্যকর হবে।

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// একাধিক লিসেনার যোগ করা
myEmitter.on('event1', () => {
  console.log('Listener 1: event1 triggered!');
});

myEmitter.on('event1', () => {
  console.log('Listener 2: event1 triggered!');
});

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event1');

এখানে, দুটি লিসেনার 'event1' ইভেন্টে যোগ করা হয়েছে। যখন emit() মেথড ব্যবহার করে 'event1' ইভেন্ট ট্রিগার করা হয়েছে, তখন দুইটি লিসেনার একে একে কার্যকর হবে এবং কনসোলে দুটি মেসেজ প্রিন্ট হবে।

৩. once() মেথড ব্যবহার করে একবারের জন্য লিসেনার যোগ করা

যদি আপনি চান যে কোনো ইভেন্ট শুধুমাত্র একবার ট্রিগার হোক এবং তার পর আর কোনো লিসেনার চালানো না হোক, তাহলে once() মেথড ব্যবহার করতে হবে।

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// একবারের জন্য লিসেনার যোগ করা
myEmitter.once('event1', () => {
  console.log('This will run only once');
});

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event1');
myEmitter.emit('event1');  // দ্বিতীয় বার ইভেন্টটি ট্রিগার হলে কিছু হবে না

এখানে, once() মেথডটি নিশ্চিত করবে যে 'event1' শুধুমাত্র একবারই ট্রিগার হবে এবং পরবর্তী ট্রিগারগুলোর জন্য কোনো কার্যকলাপ হবে না।


৩. Event Listener ম্যানেজমেন্ট

ইভেন্ট লিসেনার মুছে ফেলা

কখনও কখনও আপনাকে ইভেন্ট লিসেনার মুছে ফেলতে হতে পারে। Node.js এ removeListener() অথবা off() মেথড দিয়ে ইভেন্ট লিসেনার মুছে ফেলা যায়।

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// লিসেনার যোগ করা
const listener = () => {
  console.log('This is a listener for event1');
};
myEmitter.on('event1', listener);

// ইভেন্ট ট্রিগার করা
myEmitter.emit('event1');

// লিসেনার মুছে ফেলা
myEmitter.removeListener('event1', listener);

// ইভেন্ট ট্রিগার করা, কোনো আউটপুট হবে না
myEmitter.emit('event1');

এখানে, removeListener() মেথডের মাধ্যমে 'event1' ইভেন্টের জন্য লিসেনারটি মুছে ফেলা হয়েছে। দ্বিতীয়বার emit() করলে কোনো আউটপুট হবে না কারণ লিসেনারটি আর কার্যকরী নয়।


সারাংশ

  • Event Listener হল একটি ফাংশন যা একটি নির্দিষ্ট ইভেন্ট ঘটার পর কার্যকর হয়।
  • JavaScript (Client-Side) এ addEventListener() মেথড ব্যবহার করে DOM উপাদানের সাথে ইভেন্ট লিসেনার যোগ করা হয়।
  • Node.js এ, EventEmitter ক্লাস ব্যবহার করে কাস্টম ইভেন্ট এবং লিসেনার তৈরি করা যায়।
  • একাধিক লিসেনার যোগ করা, একবারের জন্য লিসেনার যুক্ত করা এবং লিসেনার মুছে ফেলা সবই সহজেই করা যায় on(), once(), এবং removeListener() মেথডের মাধ্যমে।
Content added By

Asynchronous Events এবং Callback Functions

205

JavaScript এ Asynchronous (অ্যাসিনক্রোনাস) প্রোগ্রামিং এবং Callback Functions একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, বিশেষ করে যখন আমাদের সার্ভার থেকে ডাটা আনা, ফাইল পড়া, বা নেটওয়ার্ক কলের মতো দীর্ঘস্থায়ী অপারেশনগুলি করতে হয়। এই অপারেশনগুলিকে অ্যাসিনক্রোনাসভাবে সম্পাদন করার ফলে সিস্টেমের পারফরম্যান্স উন্নত হয় এবং ব্যবহারকারীর অভিজ্ঞতা আরও দ্রুত হয়।

এখানে Asynchronous Events এবং Callback Functions এর ব্যাখ্যা দেওয়া হচ্ছে।


১. Asynchronous Events (অ্যাসিনক্রোনাস ইভেন্ট)

Asynchronous অপারেশনগুলির মধ্যে, একটি কাজ অন্য কাজের সাথে একসাথে চলতে থাকে, যার মানে হল যে আপনি একটি অপারেশন শুরু করার পর, অন্য কোন কাজ করার জন্য কোড চলতে থাকবে এবং যখন সেই অপারেশনটি সম্পন্ন হবে, তখন ফলাফলটি উপস্থাপন করা হবে। এই পদ্ধতি non-blocking I/O মডেলকে সমর্থন করে, যেখানে দীর্ঘস্থায়ী অপারেশনগুলো (যেমন ডেটাবেস কল, ফাইল পড়া ইত্যাদি) কার্যকরীভাবে সম্পন্ন হতে পারে, এবং সিস্টেমের অন্যান্য অংশগুলোর কার্যক্রম থেমে যায় না।

উদাহরণ:

ধরা যাক, আপনি একটি ডাটা ফাইল থেকে পড়তে চান। যদি এটি synchronous (সিঙ্ক্রোনাস)ভাবে করা হয়, তবে সার্ভার অন্য কোন কাজ করতে পারবে না যতক্ষণ না সেই ফাইলটি পুরোপুরি পড়ে না। কিন্তু asynchronous পদ্ধতিতে, এটি অন্য কাজ করার সুযোগ দেয় যখন ফাইলটি পড়া হচ্ছে।


২. Callback Functions (কলব্যাক ফাংশন)

Callback Function হল একটি ফাংশন যা অন্য ফাংশনের প্যারামিটার হিসেবে পাস করা হয় এবং প্রথম ফাংশনটির কার্যক্রম শেষ হওয়ার পর সেটি কল (অথবা ট্রিগার) করা হয়। অ্যাসিনক্রোনাস অপারেশনগুলিতে কলব্যাক ব্যবহৃত হয়, যেখানে একটি অপারেশন শেষ হওয়ার পর কলব্যাক ফাংশনটি চালু হয়।

উদাহরণ:

ধরা যাক, আমাদের একটি ফাংশন আছে fetchData() যা ২ সেকেন্ডে কিছু ডাটা ফেরত দিবে। এখানে, fetchData() ফাংশনটি একটি callback function পাস করবে, যাতে ডাটা ফেরত আসলে সেটি প্রক্রিয়া করা যাবে।

function fetchData(callback) {
    setTimeout(() => {
        const data = "Data fetched successfully!";
        callback(data);  // callback function call
    }, 2000);
}

function processData(data) {
    console.log("Processing: " + data);
}

// fetchData এর মাধ্যমে কলব্যাক ফাংশনটি পাস করা হচ্ছে
fetchData(processData);

এখানে, fetchData() একটি অ্যাসিনক্রোনাস ফাংশন, যা ২ সেকেন্ড পরে processData() নামক callback ফাংশনটি কল করবে।

কলব্যাক ফাংশনের মূল কার্যাবলী:

  1. অ্যাসিনক্রোনাস কার্যকলাপ: কলব্যাক ফাংশন অ্যাসিনক্রোনাস অপারেশন শেষ হওয়ার পর কল করা হয়।
  2. ডাটা প্রসেসিং: একবার অ্যাসিনক্রোনাস কার্যক্রম সম্পন্ন হলে, কলব্যাক ফাংশনটি ডাটা প্রসেসিং বা পরবর্তী কার্যক্রম পরিচালনা করতে পারে।

৩. Callback Hell (কলব্যাক হেল)

একাধিক অ্যাসিনক্রোনাস অপারেশন একে অপরের মধ্যে কলব্যাক হিসেবে সংযুক্ত হলে, কোডটি জটিল এবং পঠনযোগ্য হতে পারে, যা Callback Hell (বা Pyramid of Doom) নামক সমস্যার সৃষ্টি করে। এখানে, একটি কলব্যাক ফাংশনের ভিতর অন্য একটি কলব্যাক ফাংশন থাকে এবং এটি বহু স্তরে চলে যায়, ফলে কোডটি অনেক জটিল হয়ে ওঠে।

উদাহরণ (Callback Hell):

fetchData((data) => {
    processData(data, (result) => {
        saveData(result, (savedData) => {
            sendConfirmation(savedData, (confirmation) => {
                console.log(confirmation);
            });
        });
    });
});

এখানে, একের পর এক কলব্যাক প্যাসিং করা হচ্ছে, যা কোডটিকে পিরামিডের মতো দেখতে করতে পারে। এটি বড় এবং জটিল অ্যাসিনক্রোনাস কোডে সমস্যার সৃষ্টি করে, যা পরবর্তীতে রক্ষণাবেক্ষণ এবং বুঝতে অসুবিধা হতে পারে।


৪. Promises (প্রমিসেস)

Promises হল Callback Hell সমস্যা সমাধানের জন্য একটি শক্তিশালী পদ্ধতি। প্রমিসেসের মাধ্যমে অ্যাসিনক্রোনাস অপারেশনকে আরও পরিষ্কার এবং সহজভাবে পরিচালনা করা যায়। একটি প্রমিসের তিনটি অবস্থা থাকে: pending (অপেক্ষমাণ), fulfilled (সম্পন্ন), এবং rejected (বাতিল)।

উদাহরণ:

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = "Data fetched successfully!";
            resolve(data);  // Promise fulfilled
        }, 2000);
    });
}

fetchData().then(data => {
    console.log("Processing: " + data);
}).catch(error => {
    console.log("Error: " + error);
});

এখানে, fetchData() ফাংশনটি একটি Promise ফেরত দেয় এবং then() এবং catch() ব্যবহার করে ফলাফল বা ত্রুটি হ্যান্ডলিং করা হয়।


৫. Async/Await (অ্যাসিঙ্ক/অওয়েট)

Async/Await হল ES2017 (ES8) তে পরিচিত একটি সিনট্যাক্স, যা Promises ব্যবহারের উপর ভিত্তি করে কাজ করে, তবে এটি আরও সহজ এবং সিনক্রোনাস কোডের মতো দেখতে হয়।

উদাহরণ:

async function fetchData() {
    const data = await new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched successfully!");
        }, 2000);
    });
    console.log("Processing: " + data);
}

fetchData();

এখানে, await কিওয়ার্ডটি Promise এর ফলাফল আসা পর্যন্ত অপেক্ষা করে এবং তারপর এটি সিনক্রোনাস কোডের মতো কাজ করে, তবে এটি অ্যাসিনক্রোনাস কাজই করছে।


সারাংশ

  • Asynchronous Programming: অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের মাধ্যমে দীর্ঘস্থায়ী অপারেশনগুলি যেমন ডাটাবেস কল, ফাইল পড়া, ইত্যাদি কার্যক্রম সিস্টেমের অন্য কাজগুলোকে ব্লক না করে সম্পন্ন করা যায়।
  • Callback Functions: অ্যাসিনক্রোনাস কার্যক্রম শেষ হওয়ার পর কলব্যাক ফাংশন কল হয় এবং পরবর্তী কাজ পরিচালনা করে।
  • Callback Hell: একাধিক কলব্যাক ফাংশন একসাথে ব্যবহারের ফলে কোড জটিল হয়ে যায়, যাকে Callback Hell বলা হয়।
  • Promises: Promises হল অ্যাসিনক্রোনাস অপারেশনগুলির জন্য একটি পরিষ্কার এবং পরিচালনাযোগ্য সমাধান।
  • Async/Await: Async/Await, Promises এর ওপর ভিত্তি করে সহজ এবং পরিষ্কার সিনট্যাক্স প্রদান করে, যা অ্যাসিনক্রোনাস কোডকে আরও সহজ করে তোলে।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...